// api/index.ts - Axios HTTP客户端配置
// 这个文件配置了应用的HTTP请求客户端，包括基础URL、拦截器和错误处理

// 导入axios库：一个基于Promise的HTTP客户端，用于浏览器和Node.js
import axios from 'axios';

// 创建axios实例
// 根据环境变量设置基础URL：开发环境使用相对路径，生产环境使用配置的URL
// import.meta.env是Vite提供的环境变量对象，包含构建时的环境信息
// import.meta.env.DEV：判断是否为开发环境
const baseURL = import.meta.env.DEV
  ? ''  // 开发环境使用相对路径，确保Mock.js能正确拦截请求
  : import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000'; // 生产环境使用配置的URL或默认值

// 创建axios实例：配置默认的请求参数
// axios.create()方法创建一个新的axios实例，可以设置默认配置
const api = axios.create({
  baseURL, // 基础URL：所有请求都会以此URL为前缀
  timeout: 10000, // 请求超时时间：10秒后如果请求未完成则自动取消
  headers: {
    'Content-Type': 'application/json', // 默认请求头：设置内容类型为JSON
  },
});

// 请求拦截器：在发送请求之前对请求配置进行处理
// 拦截器是axios的重要特性，允许在请求和响应被处理前进行拦截和处理
api.interceptors.request.use(
  (config) => {
    // 在这里可以添加认证token等
    // 从localStorage获取token：localStorage是浏览器提供的本地存储API
    const token = localStorage.getItem('token');
    if (token) {
      // 如果存在token，添加到请求头的Authorization字段
      // Bearer是一种常见的token认证方案格式
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config; // 返回处理后的配置，继续发送请求
  },
  (error) => {
    // 请求错误处理：当请求配置出错时调用
    return Promise.reject(error); // 返回一个被拒绝的Promise，触发catch处理
  }
);

// 响应拦截器：在接收到响应后对响应数据进行处理
// 响应拦截器可以统一处理API返回的数据格式和错误
api.interceptors.response.use(
  (response) => {
    // 检查是否为mock服务器的响应格式 { msg, status, data }
    // 这个项目使用Mock.js模拟数据，需要特殊处理mock服务器的响应格式
    if (response.data && typeof response.data === 'object') {
      if ('status' in response.data) {
        // mock服务器格式：{ msg, status, data }
        if (response.data.status === 0) {
          // status为0表示成功，返回data字段的数据
          return response.data.data;
        } else {
          // 如果status不为0，表示请求失败，抛出错误
          // Promise.reject()会触发catch错误处理
          return Promise.reject(new Error(response.data.msg || '请求失败'));
        }
      } else if ('code' in response.data && 'data' in response.data) {
        // 标准API响应格式 { code, message, data }
        // 通常code为0表示成功，其他值表示失败
        return response.data.data;
      }
    }
    // 如果不是上述格式，直接返回响应数据
    return response.data;
  },
  (error) => {
    // 响应错误处理：当请求失败或服务器返回错误状态码时调用
    console.error('API Error:', error); // 在控制台输出错误信息，便于调试
    return Promise.reject(error); // 返回一个被拒绝的Promise，触发catch处理
  }
);

// 导出配置好的axios实例
// 其他模块可以导入这个实例来发送HTTP请求
export default api;